lib/commit: Add repository locking during transactions
authorDan Nicholson <nicholson@endlessm.com>
Fri, 6 Oct 2017 10:56:09 +0000 (10:56 +0000)
committerAtomic Bot <atomic-devel@projectatomic.io>
Tue, 5 Dec 2017 02:32:47 +0000 (02:32 +0000)
Take a shared repo lock during a transaction to ensure that another
process doesn't delete objects.

Closes: #1343
Approved by: cgwalters

src/libostree/ostree-repo-commit.c
src/libostree/ostree-repo-private.h

index b64ef1e00e7bfdd762370cb44f7f52e8c0dad67e..79162890ba318adacf8c96d348ae4318bf7b6cd5 100644 (file)
@@ -1304,6 +1304,8 @@ ostree_repo_scan_hardlinks (OstreeRepo    *self,
  *
  * Multithreading: This function is *not* MT safe; only one transaction can be
  * active at a time.
+ *
+ * This function takes a shared lock on the @self repository.
  */
 gboolean
 ostree_repo_prepare_transaction (OstreeRepo     *self,
@@ -1316,6 +1318,11 @@ ostree_repo_prepare_transaction (OstreeRepo     *self,
 
   memset (&self->txn.stats, 0, sizeof (OstreeRepoTransactionStats));
 
+  self->txn_locked = ostree_repo_lock_push (self, OSTREE_REPO_LOCK_SHARED,
+                                            cancellable, error);
+  if (!self->txn_locked)
+    return FALSE;
+
   self->in_transaction = TRUE;
   if (self->min_free_space_percent > 0)
     {
@@ -1836,6 +1843,13 @@ ostree_repo_commit_transaction (OstreeRepo                  *self,
   if (!ot_ensure_unlinked_at (self->repo_dir_fd, "transaction", 0))
     return FALSE;
 
+  if (self->txn_locked)
+    {
+      if (!ostree_repo_lock_pop (self, cancellable, error))
+        return FALSE;
+      self->txn_locked = FALSE;
+    }
+
   if (out_stats)
     *out_stats = self->txn.stats;
 
@@ -1876,6 +1890,13 @@ ostree_repo_abort_transaction (OstreeRepo     *self,
 
   self->in_transaction = FALSE;
 
+  if (self->txn_locked)
+    {
+      if (!ostree_repo_lock_pop (self, cancellable, error))
+        return FALSE;
+      self->txn_locked = FALSE;
+    }
+
   return TRUE;
 }
 
index ae51cea342b3280bb3cdbf68a35e3b62fc301e1e..764540a2239262125265233ce320707ca522eff6 100644 (file)
@@ -122,6 +122,7 @@ struct OstreeRepo {
 
   GMutex txn_lock;
   OstreeRepoTxn txn;
+  gboolean txn_locked;
 
   GMutex cache_lock;
   guint dirmeta_cache_refcount;